﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Entidad;
using System.Data.SqlClient;

namespace DAO
{
    public class DetalleRestauracionDAO : RestauracionInterface
    {
        public bool GuardarDetalle(DetalleRestauracionEnt detalle, SqlTransaction tran, int id_Restauracion, SqlConnection con)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.Transaction = tran;
                String comando = "INSERT INTO DetalleRestauracion ";
                comando += "(id_TipoRestauracion, id_Restauracion, costo, detalle) VALUES ";
                comando += "(@id_TipoRestauracion, @id_Restauracion, @costo, @descripcion)";
                cmd.Parameters.AddWithValue("@id_TipoRestauracion", detalle.Id_TipoRestauracion);
                cmd.Parameters.AddWithValue("@id_Restauracion", id_Restauracion);
                cmd.Parameters.AddWithValue("@costo", detalle.Costo);
                if (detalle.Descripcion != null)
                {
                    cmd.Parameters.AddWithValue("@descripcion", detalle.Descripcion);
                }
                else
                {
                    cmd.Parameters.AddWithValue("@descripcion", DBNull.Value);
                }
                cmd.CommandText = comando;
                cmd.ExecuteNonQuery();
                return true;

            }
            catch (SqlException)
            {
                return false;
                throw new ApplicationException();
            }

        }

        public void ActualizarDetalle(DetalleRestauracionEnt detalle, SqlTransaction tran, SqlConnection con)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.Transaction = tran;
                String consulta = "UPDATE DetalleRestauracion ";
                consulta += "SET id_TipoRestauracion = @id_TipoRestauracion, costo = @costo, detalle = @detalle ";
                consulta += "WHERE id_DetalleRestauracion = @id_DetalleRestauracion ";
                cmd.Parameters.AddWithValue("@id_tipoRestauracion",detalle.Id_TipoRestauracion);
                cmd.Parameters.AddWithValue("@costo",detalle.Costo);
                if (detalle.Descripcion != null)
                {
                    cmd.Parameters.AddWithValue("@detalle", detalle.Descripcion);
                }else
                {
                    cmd.Parameters.AddWithValue("@detalle", DBNull.Value);
                }
                cmd.Parameters.AddWithValue("@id_DetalleRestauracion",detalle.Id_DetalleRestauracion);
                cmd.CommandText = consulta;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                throw new ApplicationException("Error al actualizar el detalle");
            }
        }
        public void EliminarDetalle(DetalleRestauracionEnt detalle, SqlTransaction tran, SqlConnection con)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.Transaction = tran;
                String consulta = "DELETE FROM DetalleRestauracion ";
                consulta += "WHERE id_DetalleRestauracion = @id_DetalleRestauracion ";
                cmd.Parameters.AddWithValue("@id_DetalleRestauracion", detalle.Id_DetalleRestauracion);
                cmd.CommandText = consulta;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException)
            {
                throw new ApplicationException("Error al actualizar el detalle");
            }
        }

        public List<DetalleRestauracionEnt> ObtenerDetalles(int restauracion, int ejemplar)
        {
            SqlConnection con = new SqlConnection(DAO_v2.MiCadenaConexion());
            try
            {
                con.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandType = System.Data.CommandType.Text;
                String consulta = "SELECT ";
                consulta += "D.id_DetalleRestauracion, D.id_Restauracion, D.id_TipoRestauracion, D.costo, D.detalle, "; //Detalle Restauracion
                consulta += "T.nombre ";
                consulta += "FROM DetalleRestauracion D ";
                consulta += "LEFT JOIN Restauracion R ON D.id_Restauracion = R.id_Restauracion ";
                consulta += "LEFT JOIN TipoRestauracion T ON D.id_TipoRestauracion = T.id_TipoRestauracion ";
                consulta += "LEFT JOIN Ejemplar E ON R.id_Ejemplar = E.id_Ejemplar ";
                consulta += "WHERE R.numero = @numero ";
                consulta +="AND E.codigo = @codigo ";
                cmd.Parameters.AddWithValue("@numero", restauracion);
                cmd.Parameters.AddWithValue("@codigo", ejemplar);
                cmd.CommandText = consulta;
                List<DetalleRestauracionEnt> resultado = new List<DetalleRestauracionEnt>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    DetalleRestauracionEnt detalle = new DetalleRestauracionEnt();
                    detalle.Id_DetalleRestauracion = int.Parse(dr["id_DetalleRestauracion"].ToString());
                    detalle.Id_Restauracion = int.Parse(dr["id_Restauracion"].ToString());
                    detalle.Id_TipoRestauracion = int.Parse(dr["id_TipoRestauracion"].ToString());
                    detalle.Costo = decimal.Parse(dr["costo"].ToString());
                    if (dr["detalle"] != DBNull.Value)
                    {
                        detalle.Descripcion = dr["detalle"].ToString();
                    }
                    detalle.Tipo = dr["nombre"].ToString();
                    resultado.Add(detalle);
                }
                return resultado;
            }
            catch(SqlException)
            {
                return null;
                throw new ApplicationException("Error al obtener los detalles");
            }
            finally
            {
                if (con.State == System.Data.ConnectionState.Open)
                {
                    con.Close();
                }
            }
        }


        //Metodos no implementados de la interface
        public List<RestauracionQuery> ObtenerRestauraciones(int codEjemplar)
        {
            throw new NotImplementedException();
        }

        public List<EjemplarBusquedaQueryEnt> BuscarEjemplares(List<string> filtros)
        {
            throw new NotImplementedException();
        }

        public int? ObtenerNumeroUltima(int codEjemplar)
        {
            throw new NotImplementedException();
        }

        public List<TipoRestauracionEnt> ObtenerTiposRestauracion()
        {
            throw new NotImplementedException();
        }

        public bool GuardarRestauracion(RestauracionEnt restauracion, List<DetalleRestauracionEnt> detalles)
        {
            throw new NotImplementedException();
        }

        public RestauracionEnt ObtenerRestauracion(int numero, int codigo)
        {
            throw new NotImplementedException();
        }

        public void ActualizarRestauracion(RestauracionEnt restauracion, List<DetalleRestauracionEnt> agregar, List<DetalleRestauracionEnt> eliminar, List<DetalleRestauracionEnt> actualizar)
        {
            throw new NotImplementedException();
        }
    }
}
